//Written in the D Programming Language
/*
 * Copyright (c) 2008 OpenGLUtils
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'OpenGLUtils' nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
module testapps.TestArrays;

import testapps.TestApp;

import openglutils.GL;
import openglutils.GLU;
import openglutils.SDL;
import openglutils.GLArray;
import openglutils.Vector;

import tango.stdc.stringz;

void main(char[][] args)
{
	auto test = new TestArrays();
	test.createGLWindow("Test Vector3 and Color Arrays", 800, 600, 32, false);
	test.initGL();
	test.initArrays();
	test.run();
}

public class TestArrays: TestApp
{
	private GLVertexArray vertexArray;

	private GLColorArray colorArray;

	private float rotationAngle = 0.0f;
	
	public void initGL()
	{
		glShadeModel(GL_SMOOTH);
		glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
		glClearDepth(1.0f);
		glEnable(GL_DEPTH_TEST);
		glDepthFunc(GL_LEQUAL);
	}

	public void initArrays()
	{
		vertexArray = new GLVertexArray();
		colorArray = new GLColorArray();

		vertexArray.addVector(Vector3(-1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 0.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 0.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 0.0, 0.0));
		vertexArray.addVector(Vector3(-1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 0.0, 0.0));

		vertexArray.addVector(Vector3(-1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(-1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 0.0));

		vertexArray.addVector(Vector3(-1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(-1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(1.0, 1.0, 1.0));

		vertexArray.addVector(Vector3(-1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 1.0));
		vertexArray.addVector(Vector3(-1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 1.0));

		vertexArray.addVector(Vector3(1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 0.0));
		vertexArray.addVector(Vector3(1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 1.0, 0.0));

		vertexArray.addVector(Vector3(-1.0f, -1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 0.0, 1.0));
		vertexArray.addVector(Vector3(-1.0f, -1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 0.0, 1.0));
		vertexArray.addVector(Vector3(-1.0f, 1.0f, 1.0f));
		colorArray.addVector(Vector3(0.0, 0.0, 1.0));
		vertexArray.addVector(Vector3(-1.0f, 1.0f, -1.0f));
		colorArray.addVector(Vector3(0.0, 0.0, 1.0));
	}

	void keyPressed(int key)
	{
	}

	void keyReleased(int key)
	{
		if(key == SDLK_ESCAPE)
		{
			running = false;
		}
	}

	void drawGLScene()
	{
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glLoadIdentity();
		glTranslatef(0.0f, 0.0f, -8.0f);

		glRotatef(rotationAngle, 0.2, 1.0, 0.4);

		rotationAngle += 0.3;

		if(rotationAngle > 360.0)
		{
			rotationAngle -= 360.0;
		}

		vertexArray.enable();
		colorArray.enable();
		
		vertexArray.setPointer();
		colorArray.setPointer();

		vertexArray.drawQuads();

		vertexArray.disable();
		colorArray.disable();
	}
}
